package com.example.design.shejimoshi.action.template.spring;

/**
 * 模板⽅法设计模式
 * 抽象模板(Abstract Template): 定义⼀个模板⽅法，这个模板⽅法⼀般是⼀个具体⽅法，给出⼀个顶级算法⻣架，
 * ⽽逻辑⻣架的组成步骤在相应的抽象操作中，推迟到⼦类实现
 * 模板⽅法：定义了算法的⻣架，按某种顺序调⽤其包含的基本⽅法
 * 基本⽅法：是整个算法中的⼀个步骤，包括抽象⽅法和具体⽅法
 *  抽象⽅法：在抽象类中申明，由具体⼦类实现。
 *  具体⽅法：在抽象类中已经实现，在具体⼦类中 可以继承或重写它
 * @author zhou
 */
public abstract class AbstractTemplate {


    /**
     * 模版⽅法 : 每日日常
     */
    public void dailyRoutineTemplateMethod(){
        getUp();
        wash();
        changeClothesAbstractMethod();
        haveMealAbstractMethod();
        commuteAbstractMethod();
    }

    /**
     * 具体⽅法
     */
    public void getUp() {
        System.out.println("6点起床");
    }

    /**
     * 具体⽅法
     */
    public void wash() {
        System.out.println("洗漱");
    }

    /**
     * 定义钩子方法的一种方式，空实现
     * 换衣服
     */
    public void changeClothesAbstractMethod(){};

    /**
     * 定义钩子方法的另一种方式，抽象方法
     * 抽象⽅法 吃饭
     */
    public abstract void haveMealAbstractMethod();

    /**
     * 抽象⽅法 通勤
     */
    public abstract void commuteAbstractMethod();

}

